home *** CD-ROM | disk | FTP | other *** search
/ The PC-SIG Library 10 / The PC-Sig Library - Shareware for the IBM PC and Compatibles (PC-SIG)(Tenth Edition Disks 1-2804)(1991).iso / PC_SIGCD / 22 / 2 / DISK2220.ZIP / SCREDIT2.EXE / VALIDATE.C < prev    next >
Text File  |  1990-12-23  |  14KB  |  666 lines

  1. /* Turbo ScrEdit Validate Procedures */
  2.  
  3. void S_Find_Min_and_Max()
  4. {
  5. int C1, C2, s_len;
  6.  
  7. s_compmin[0]=0;
  8. s_compmax[0]=0;
  9. C1 = 0;
  10. C2 = 0;
  11.  
  12. s_len=strlen(s_curstr);
  13.  
  14. s_min_max_loaded = 0;
  15. s_endofline    = 0;
  16.  
  17. while (!s_min_max_loaded)
  18.   {
  19.   s_sub++;
  20.   if  (s_sub<s_len)
  21.     {
  22.     if  (s_curstr[s_sub]==94)
  23.       {
  24.       s_sub++;
  25.       s_compmax[C2++]=s_curstr[s_sub];
  26.       }
  27.     else
  28.       {
  29.       if  (s_curstr[s_sub]==39)
  30.         {
  31.         if  (s_compmax[0]==0) strcpy(s_compmax,s_compmin);
  32.         s_min_max_loaded = 1;
  33.         }
  34.       else
  35.         {
  36.         if  (s_compmax[0]==0)
  37.           {
  38.           s_compmin[C1++]=s_curstr[s_sub];
  39.           s_compmin[C1]=0;
  40.           }
  41.         else
  42.           {
  43.           s_compmax[C2++]=s_curstr[s_sub];
  44.           s_compmax[C2]=0;
  45.           }
  46.         }
  47.       }
  48.     if  ((s_compmin[0]==92)||(s_compmin[0]==61)) s_min_max_loaded = 1;
  49.     }
  50.   else
  51.     {
  52.     s_min_max_loaded=1;
  53.     s_endofline   =1;
  54.     }
  55.   }
  56. if  (s_upcase)
  57.   {
  58.   strcpy(s_compmin,strupr(s_compmin));
  59.   strcpy(s_compmax,strupr(s_compmax));
  60.   }
  61. }
  62.  
  63.  
  64.  
  65.  
  66. void S_ReadNextRangeRec()
  67. {
  68. unsigned int Y;
  69. long rec;
  70.  
  71. s_currline = s_nextline;
  72.  
  73. if  (s_vrec != s_nextrec)
  74.   {
  75.   rec = (long) (s_nextrec)*sizeof(*s_indx);
  76.   fseek(s_file,rec,0);
  77.   fread(s_indx,sizeof(*s_indx),1,s_file);
  78.   s_vrec = s_nextrec;
  79.   }
  80.  
  81. s_nextrec   = s_indx->D.s_rangerec [s_currline];
  82. s_nextline  = s_indx->D.s_rangeline[s_currline]-1;
  83. Y           = s_indx->D.s_rangelist[s_currline][0];
  84. setmem(&s_indx->D.s_rangelist[s_currline][Y+1],78-Y,0);
  85. movmem(&s_indx->D.s_rangelist[s_currline][1],&s_curstr,
  86.        s_indx->D.s_rangelist[s_currline][0]+1);
  87. s_sub = (s_insideif) ? 4:1;
  88. s_compmin[0]=0;
  89. s_compmax[0]=0;
  90. }
  91.  
  92.  
  93.  
  94.  
  95. void S_ProcessDate()
  96. {
  97. char
  98.  DateMask[40],
  99.  TestMonth[3],
  100.  TestDay[3],
  101.  TestYear[5],
  102.  CheckMonth,
  103.  CheckDay,
  104.  CheckYear;
  105. int
  106.  x,y,z,
  107.  WorkMonth,
  108.  WorkDay,
  109.  WorkYear,
  110.  WorkNum;
  111.  
  112. CheckMonth   = 0;
  113. CheckDay     = 0;
  114. CheckYear    = 0;
  115. WorkMonth    = 0;
  116. WorkDay      = 0;
  117. WorkYear     = 0;
  118. s_errormsg[0]     = 0;
  119. x = (s_insideif) ? 8:5;
  120. z = x;
  121. y = 0;
  122.  
  123. while (s_curstr[x]!=0)
  124.   {
  125.   switch (s_curstr[x])
  126.     {
  127.     case 'D':
  128.       {
  129.       if  (!isdigit(s_editstr[y]))
  130.         {
  131.         strcpy(s_errormsg,"Day contains a invalid character for <");
  132.         strcat(s_errormsg,(char *)&s_curstr[z]);
  133.         strcat(s_errormsg,"> Format");
  134.         goto Exit_Point;
  135.         }
  136.       CheckDay++;
  137.       TestDay[CheckDay-1]=s_editstr[y];
  138.       TestDay[CheckDay]  =0;
  139.       break;
  140.       }
  141.     case 'M':
  142.       {
  143.       if  (!isdigit(s_editstr[y]))
  144.         {
  145.         strcpy(s_errormsg,"Month contains a invalid character for <");
  146.         strcat(s_errormsg,(char *)&s_curstr[z]);
  147.         strcat(s_errormsg,"> Format");
  148.         goto Exit_Point;
  149.         }
  150.       CheckMonth++;
  151.       TestMonth[CheckMonth-1]=s_editstr[y];
  152.       TestMonth[CheckMonth]  =0;
  153.       break;
  154.       }
  155.    case 'Y':
  156.       {
  157.       if  (!isdigit(s_editstr[y]))
  158.         {
  159.         strcpy(s_errormsg,"Year contains a invalid character for <");
  160.         strcat(s_errormsg,(char *)&s_curstr[z]);
  161.         strcat(s_errormsg,"> Format");
  162.         goto Exit_Point;
  163.         }
  164.       CheckYear++;
  165.       TestYear[CheckYear-1]=s_editstr[y];
  166.       TestYear[CheckYear]  =0;
  167.       break;
  168.       }
  169.    default :
  170.       {
  171.       if  (s_editstr[y]!=s_curstr[x])
  172.         {
  173.         strcpy(s_errormsg,"Please enter date in <");
  174.         strcat(s_errormsg,(char *)&s_curstr[z]);
  175.         strcat(s_errormsg,"> Format");
  176.         goto Exit_Point;
  177.         }
  178.       }
  179.     }
  180.   y++;
  181.   x++;
  182.   }
  183.  
  184. if  (s_editstr[y]!=0)
  185.   {
  186.   strcpy(s_errormsg,"You have keyed to many charactes for <");
  187.   strcat(s_errormsg,(char *)&s_curstr[z]);
  188.   strcat(s_errormsg,"> Format");
  189.   goto Exit_Point;
  190.   }
  191.  
  192. WorkDay   = (CheckDay  >0) ? atoi(TestDay)  :0;
  193. WorkMonth = (CheckMonth>0) ? atoi(TestMonth):0;
  194. WorkYear  = (CheckYear >0) ? atoi(TestYear) :0;
  195. WorkNum   = (WorkYear/4);
  196. WorkNum  *= 4;
  197. WorkNum  -= WorkYear;
  198.  
  199. if  ((CheckMonth>0)&&((WorkMonth < 1)||(WorkMonth>12)))
  200.   {
  201.   strcpy(s_errormsg,"You have keyed a invalid Month. Use 1 thru 12 only");
  202.   goto Exit_Point;
  203.   }
  204.  
  205. if  (CheckDay>0)
  206.   {
  207.   if  ((WorkMonth==4)||(WorkMonth==6)||(WorkMonth==9)||(WorkMonth==11))
  208.     {
  209.     if  (WorkDay>30)
  210.       {
  211.       strcpy(s_errormsg,"This month can have only 30 days or less");
  212.       goto Exit_Point;
  213.       }
  214.     }
  215.   else
  216.     {
  217.     if  ((WorkMonth!=2)&&(WorkDay>31))
  218.       {
  219.       strcpy(s_errormsg,"This month can have only 31 days or less");
  220.       goto Exit_Point;
  221.       }
  222.     else
  223.       {
  224.       if  (WorkMonth == 2)
  225.         {
  226.         if  (WorkNum==0)
  227.           {
  228.           if  (WorkDay>29)
  229.             {
  230.             strcpy(s_errormsg,"February can have only 29 days or less");
  231.             goto Exit_Point;
  232.             }
  233.           }
  234.         else
  235.           {
  236.           if  (WorkDay>28)
  237.             {
  238.             strcpy(s_errormsg,"February can have only 28 days or less");
  239.             goto Exit_Point;
  240.             }
  241.           }
  242.         }
  243.       }
  244.     }
  245.   }
  246.  
  247. if  ((CheckYear>0)&&(WorkYear<1))
  248.   {
  249.   strcpy(s_errormsg,"Year must have a value greater than zero.");
  250.   goto Exit_Point;
  251.   }
  252.  
  253. Exit_Point:
  254.  
  255. if  (s_errormsg[0]!=0)
  256.   {
  257.   s_screenvalid       = 0;
  258.   s_validate_finished = 1;
  259.   s_skip              = 1;
  260.   }
  261. }
  262.  
  263.  
  264.  
  265. void S_ProcessIn()
  266. {
  267. int x,y,z;
  268.  
  269. s_getfieldtype(s_field->C.s_type[s_point]);
  270. s_decimal = s_ftype;
  271.  
  272. s_matched    = 0;
  273. s_compmin[0] = 0;
  274.  
  275. if  (!s_matched)
  276.   {
  277.   while ((!s_matched)&&(s_compmin[0]!=92)&&(s_compmin[0]!='='))
  278.     {
  279.     S_Find_Min_and_Max();
  280.     if  ((s_compmin[0]!=92)&&(s_compmin[0]!='=')&&(!s_endofline))
  281.       {
  282.       if  (s_decimal < 8)
  283.         {
  284.         s_numeric       = atof(s_editstr);
  285.         s_compmin_Numeric = atof(s_compmin);
  286.         s_compmax_Numeric = atof(s_compmax);
  287.         if ((s_numeric>=s_compmin_Numeric)&&(s_numeric<=s_compmax_Numeric))
  288.           s_matched = 1;
  289.         }
  290.       else
  291.         {
  292.         if ((strcmp(s_editstr,s_compmin)>=0) &&
  293.             (strcmp(s_editstr,s_compmax)<=0))
  294.           s_matched = 1;
  295.         }
  296.       }
  297.     if  ((s_endofline) && ((s_compmin[0]==0) && (s_compmax[0]==0)))
  298.       {
  299.       S_ReadNextRangeRec();
  300.       while ((s_curstr[s_sub]!=39)&&
  301.              (s_curstr[s_sub]!=92)&&
  302.              (s_curstr[s_sub++]!='='));
  303.       if  ((s_curstr[s_sub]==92)||(s_curstr[s_sub]=='='))
  304.         {
  305.         s_compmin[0]=s_curstr[s_sub];
  306.         s_compmin[1]=0;
  307.         }
  308.       }
  309.     }
  310.   }
  311.  
  312. if  (s_matched)
  313.   {
  314.   while ((s_curstr[s_sub]!=92)&&(s_curstr[s_sub]!='='))
  315.     {
  316.     s_sub=0;
  317.     while ((s_curstr[s_sub]!=0)&&
  318.            (s_curstr[s_sub]!=92)&&
  319.            (s_curstr[s_sub]!='=')) s_sub++;
  320.     if  ((s_curstr[s_sub]!=92)&&(s_curstr[s_sub]!='='))
  321.       {
  322.       S_ReadNextRangeRec();
  323.       s_sub=0;
  324.       }
  325.     }
  326.   if  (s_curstr[s_sub]=='=')
  327.     {
  328.     s_screenvalid       = 0;
  329.     s_validate_finished = 1;
  330.     strcpy(s_errormsg,(char *)&s_curstr[s_sub+1]);
  331.     }
  332.   else
  333.     {
  334.     s_opcode[0]=0;
  335.     s_matched = 0;
  336.     }
  337.   }
  338. else
  339.   {
  340.   if  (s_curstr[s_sub]==92)
  341.     {
  342.     s_screenvalid       = 0;
  343.     s_validate_finished = 1;
  344.     strcpy(s_errormsg,(char *)&s_curstr[s_sub+1]);
  345.     }
  346.   else
  347.     s_opcode[0]=0;
  348.   }
  349. }
  350.  
  351.  
  352.  
  353. void S_Processif()
  354. {
  355. int c,x,y,z;
  356. s_matched = 0;
  357. s_compmin[0]=0;
  358. s_compmax[0]=0;
  359. s_endofline =0;
  360.  
  361. while (strcmp(s_compmin,"THEN")!=0)
  362.   {
  363.   if  (s_endofline)
  364.     {
  365.     S_ReadNextRangeRec();
  366.     s_sub=0;
  367.     while ((s_curstr[s_sub]!=0)&&(s_curstr[s_sub]!=39)) s_sub++;
  368.     }
  369.  
  370.   if  (s_curstr[3]=='N')
  371.     {
  372.     x = 7;
  373.     s_opcode1[0]='N';
  374.     }
  375.   else
  376.     {
  377.     x = 3;
  378.     s_opcode1[0]=0;
  379.     }
  380.  
  381.   y=0;
  382.   while (x>0)
  383.     {
  384.     if   ((s_curstr[x]!=39)&&(s_curstr[x]!=32)) s_compfield[y++]=s_curstr[x++];
  385.     else x=0;
  386.     s_compfield[y]=0;
  387.     }
  388.  
  389.   strupr(s_compfield);
  390.  
  391.   s_fieldnum = 0;
  392.   x        = 1;
  393.   while (x)
  394.     {
  395.     if  (s_fieldnum == s_curr.s_count)
  396.       {
  397.       s_fieldnum = -1;
  398.       x        = 0;
  399.       }
  400.     else
  401.       if  (strcmp(s_compfield,strupr(s_field->C.s_fieldname[s_fieldnum]))==0)
  402.         x=0;
  403.       else
  404.         s_fieldnum++;
  405.     }
  406.  
  407.   s_compmin[0]=0;
  408.   s_compmax[0]=0;
  409.  
  410.   if   (s_fieldnum > -1) S_Get_Field_Value(s_fieldnum);
  411.   else strcpy(s_compmin,"THEN");
  412.  
  413.   if  (s_upcase) strupr(s_editstr);
  414.  
  415.   s_getfieldtype(s_field->C.s_type[s_fieldnum]);
  416.   s_decimal = s_ftype;
  417.  
  418.   s_endofline = 0;
  419.   while ((strcmp(s_compmin,"AND")!=0)&&
  420.          (strcmp(s_compmin,"OR")!=0)&&
  421.          (strcmp(s_compmin,"THEN")!=0))
  422.     {
  423.     if  (s_endofline)
  424.       {
  425.       S_ReadNextRangeRec();
  426.       s_sub=0;
  427.       while ((s_curstr[s_sub]!=0)&&(s_curstr[s_sub]!=39)) s_sub++;
  428.       }
  429.     S_Find_Min_and_Max();
  430.     if ((strcmp(s_compmin,"AND")!=0)&&
  431.         (strcmp(s_compmin,"OR")!=0) &&
  432.         (strcmp(s_compmin,"THEN")!=0))
  433.       {
  434.       if  (s_decimal<7)
  435.         {
  436.         s_numeric         = atof(s_editstr);
  437.         s_compmin_Numeric = atof(s_compmin);
  438.         s_compmax_Numeric = atof(s_compmax);
  439.         if  (s_opcode1[0]=='N')
  440.           {
  441.           if ((s_numeric<s_compmin_Numeric)||(s_numeric>s_compmax_Numeric))
  442.             s_matched = 1;
  443.           }
  444.         else
  445.           {
  446.           if ((s_numeric>=s_compmin_Numeric)&&(s_numeric<=s_compmax_Numeric))
  447.             s_matched = 1;
  448.           }
  449.         }
  450.       else
  451.         {
  452.         if  (s_opcode1[0]=='N')
  453.           {
  454.           if ((strcmp(s_editstr,s_compmin)<0)||(strcmp(s_editstr,s_compmax)>0))
  455.             s_matched = 1;
  456.           }
  457.         else
  458.           if ((strcmp(s_editstr,s_compmin)>=0)&&
  459.               (strcmp(s_editstr,s_compmax)<=0))
  460.             s_matched = 1;
  461.         }
  462.       }
  463.     }
  464.   if  (strcmp(s_compmin,"AND")==0)
  465.     {
  466.     if  (!s_matched)
  467.       {
  468.       s_compmin[0]=0;
  469.       while ((strcmp(s_compmin,"OR")!=0)&&(strcmp(s_compmin,"THEN")!=0))
  470.         {
  471.         S_ReadNextRangeRec();
  472.         s_sub=0;
  473.         while ((s_curstr[s_sub]!=0)&&(s_curstr[s_sub]!=39)) s_sub++;
  474.         s_compmin[0]=0;
  475.         while ((strcmp(s_compmin,"AND")!=0)
  476.              &&(strcmp(s_compmin,"OR")!=0)
  477.              &&(strcmp(s_compmin,"THEN")!=0))
  478.              S_Find_Min_and_Max();
  479.         }
  480.       if  (strcmp(s_compmin,"OR")==0) s_compmin[0]=0;
  481.       }
  482.     else
  483.       {
  484.       s_compmin[0] = 0;
  485.       s_matched    = 0;
  486.       }
  487.     }
  488.   else
  489.     {
  490.     if  (strcmp(s_compmin,"OR")==0)
  491.       {
  492.       if  (s_matched)
  493.         {
  494.         while (strcmp(s_compmin,"THEN")!=0)
  495.           {
  496.           S_ReadNextRangeRec();
  497.           s_sub=0;
  498.           while ((s_curstr[s_sub]!=0)&&(s_curstr[s_sub]!=39)) s_sub++;
  499.           while ((strcmp(s_compmin,"AND")!=0)
  500.                  &&(strcmp(s_compmin,"OR")!=0)
  501.                  &&(strcmp(s_compmin,"THEN")!=0))
  502.             S_Find_Min_and_Max();
  503.           }
  504.         }
  505.       else
  506.         s_compmin[0]=0;
  507.       }
  508.     }
  509.   }
  510.  
  511.  
  512. strcpy(s_editstr,s_editstrhold);
  513.  
  514. if  (s_matched)
  515.   {
  516.   s_matched  = 0;
  517.   s_insideif = 1;
  518.   while ((s_screenvalid)&&(s_curstr[0]!='E')&&(!s_skip))
  519.     {
  520.     S_ReadNextRangeRec();
  521.     if  (s_curstr[0]!='E')
  522.       {
  523.       switch (s_curstr[3])
  524.         {
  525.         case 'D' : {S_ProcessDate();break;}
  526.         case 'I' :
  527.           {
  528.           s_sub=0;
  529.           while ((s_curstr[s_sub]!=0)&& (s_curstr[s_sub]!=39)) s_sub++;
  530.           S_ProcessIn();
  531.           break;
  532.           }
  533.         case 'S' : {s_skip = 1;break;}
  534.         case 'E' :
  535.           {
  536.           s_screenvalid = 0;
  537.           strcpy(s_errormsg,&s_curstr[9]);
  538.           }
  539.         }
  540.       }
  541.     }
  542.   s_insideif = 0;
  543.   }
  544. while (strcmp(s_curstr,"ENDIF")!=0) S_ReadNextRangeRec();
  545. }
  546.  
  547.  
  548.  
  549.  
  550. void s_validate_Location()
  551. {
  552. int x,y,z;
  553. s_upcase= 0;
  554. s_insideif= 0;
  555. s_matched= 0;
  556. s_skip= 0;
  557. s_opcode[0]= 0;
  558. s_currline= 9999;
  559.  
  560. while ((s_nextrec)&&(!s_skip))
  561.   {
  562.   S_ReadNextRangeRec();
  563.   if  (s_curstr[0] == 'I') /* check for IN or if */
  564.     {
  565.     s_sub = s_pos(s_curstr,"'");
  566.     if   (s_curstr[1] == 'F') S_Processif();
  567.     else S_ProcessIn();
  568.     if  (s_validate_finished) s_nextrec = 0;
  569.     }
  570.   if  (s_curstr[0] == 'U') /* check for Upshift key word */
  571.     {
  572.     if  (s_curstr[10] == 'N') /* if ON */
  573.       {
  574.       s_upcase = 1;
  575.       strupr(s_editstr);
  576.       }
  577.     else
  578.       {
  579.       s_upcase = 0;      /* if Off */
  580.       strcpy(s_editstr,s_newstr);
  581.       }
  582.     strcpy(s_editstrhold,s_editstr);
  583.     }
  584.   if  ((s_curstr[0] == 'R')||((s_curstr[0] == 'S')&&(s_curstr[1] == 'K')))
  585.     {
  586.     x = strlen(s_editstr);
  587.     while ((x>0)&&(s_editstr[x-1]<33))
  588.       {
  589.       s_editstr[x-1]=0;
  590.       x++;
  591.       }
  592.     if  (s_editstr[0]==0)
  593.       {
  594.       if  (s_curstr[0]=='S') s_nextrec = 0;
  595.       if  (s_curstr[0]=='R')
  596.         {
  597.         s_sub = 0;
  598.         while ((s_curstr[s_sub]!=0)&&(s_curstr[s_sub]!=39)) s_sub++;
  599.         if  (s_curstr[s_sub]==39)
  600.           strcpy(s_errormsg,(char *)&s_curstr[s_sub]);
  601.         else
  602.           strcpy(s_errormsg,"** This field is required **");
  603.         s_screenvalid = 0;
  604.         s_nextrec = 0;
  605.         }
  606.       }
  607.     }
  608.   if  (s_curstr[0]=='D') S_ProcessDate();
  609.   }
  610. }
  611.  
  612.  
  613.  
  614.  
  615. void s_validatescreen()
  616. {
  617. int C;
  618. s_prevfield   = s_point;
  619. if (s_curr.s_rangerecno==0)
  620.   {
  621.   s_validate_finished = 1;
  622.   s_screenvalid       = 1;
  623.   }
  624. else
  625.   {
  626.   s_point             = -1;
  627.   s_upcase            = 0;
  628.   s_validate_finished = 0;
  629.   if  (s_validatefield > -1) s_point = s_validatefield;
  630.   }
  631. while (s_validate_finished==0)
  632.   {
  633.   if  (s_point < s_curr.s_count)
  634.     {
  635.     s_point++;
  636.     s_nextrec  = s_field->C.s_rangenextrec [s_point];
  637.     s_nextline = s_field->C.s_rangenextline[s_point]-1;
  638.     if  (s_nextrec)
  639.       {
  640.       s_screenvalid = 1;
  641.       S_Get_Field_Value(s_point);
  642.       strcpy(s_editstrhold,s_editstr);
  643.       strcpy(s_newstr,s_editstr);
  644.       s_validate_Location();
  645.       if  ((!s_screenvalid)||(s_validatefield > -1))
  646.         {
  647.         s_validate_finished = 1;
  648.         s_point--;
  649.         }
  650.       }
  651.     }
  652.   else
  653.     {
  654.     s_validate_finished = 1;
  655.     }
  656.   }
  657. if (s_screenvalid)
  658.    s_point = s_prevfield;
  659. else
  660.    if (s_isdupe(s_point)) s_setdupefields = 1;
  661. s_validatefield = -1;
  662. }
  663.  
  664.  
  665.  
  666.